#ifndef XERROR_H
#define XERROR_H
#include <memory>
#include <string>
#include <tuple>
#include <xscript/xitem.h>

class XError {
  public:
    enum XError_Enum {
        XError_NoError = 0,
        XError_GenericError,
        XError_ParseError,
        XError_NeedMoreTokenError,
        XError_BadTokenError,
        XError_AddVarError,
        XError_VariableExistedError,
        XError_UnreachedError,
        XError_ArgumentCountError,
        XError_ArgumentTypeError,
        XError_BadModuleNameError,
        XError_BadBlockError,
        XError_UndefinedVariableError,
        XError_OutOfRangeError,
        XError_OperatorError,
        XError_DivZreo,
        XError_MissIfCondition,
        XError_Unsupported,
        XError_XScriptInternalError
    };

    XError();
  public:
    void setError(XError_Enum type, const std::wstring& message);
    void setError(XError_Enum type, const std::wstring& module, uint32_t line, const std::wstring& variable);

    bool hasError()const {return errorType != XError_NoError;}
    XError_Enum getErrorType()const {return errorType;}
    std::wstring getErrorString()const {return errorString;}
    std::wstring getErrorInfo()const;
  protected:
    XError_Enum errorType;
    std::wstring errorString;
};

#endif // XCALLERROR_H
